package cn.wolfcode.wolf2w.service.impl;

import cn.wolfcode.wolf2w.domain.TravelComment;
import cn.wolfcode.wolf2w.query.TravelCommentQuery;
import cn.wolfcode.wolf2w.repository.TravelCommentRepository;
import cn.wolfcode.wolf2w.service.ITravelCommentService;
import cn.wolfcode.wolf2w.util.DateUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.*;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.List;

/**
 * 游记分类业务层的实现类
 */
@Service
public class TravelCommentServiceImpl implements ITravelCommentService {

    //  注入TravelCommentRepository持久层接口
    @Autowired
    private TravelCommentRepository travelCommentRepository;

    //  注入MongoTemplate服务
    @Autowired
    private MongoTemplate mongoTemplate;

    //  插入单个方法
    @Override
    public void insert(TravelComment travelComment) {

        //  id自动生成，手动设置为空
        travelComment.setId(null);
        travelComment.setCreateTime(DateUtil.getTime());

        //  获取被评论的评论对象的id
        String rid = travelComment.getRefComment().getId();

        //  判断被评论对象的id是否存在
        if (StringUtils.hasLength(rid)) {
            //  通过被评论对象的id查到被评论的对象并设置评论对象中
            travelComment.setRefComment(this.selectById(rid));
            //  最后在评论对象中设置类型
            travelComment.setType(TravelComment.TRAVLE_COMMENT_TYPE_COMMENT);
        }

        //  调用持久层接口的save方法执行插入单个目的地对象
        travelCommentRepository.save(travelComment);

    }

    //  删除单个方法
    @Override
    public void deleteById(String id) {

        //  调用持久层接口的deleteById方法执行删除单个目的地对象
        travelCommentRepository.deleteById(id);
    }

    //  修改单个方法
    @Override
    public void updateById(TravelComment travelComment) {

        //  调用持久层接口的save方法执行修改单个目的地对象
        travelCommentRepository.save(travelComment);
    }

    //  查询单个方法
    @Override
    public TravelComment selectById(String id) {

        //  调用持久层接口的findById方法执行查询单个目的地对象
        return travelCommentRepository.findById(id).orElse(null);
    }

    //  查询所有方法
    @Override
    public List<TravelComment> selectAll() {

        //  调用持久层接口的findAll方法执行查询所有目的地对象
        return travelCommentRepository.findAll();
    }

    //  分页方法
    @Override
    public Page<TravelComment> query(TravelCommentQuery qo) {

        //  查询对象
        Query query = new Query();

        if (StringUtils.hasLength(qo.getTravelId())) {
            query.addCriteria(Criteria.where("travelId").is(qo.getTravelId()));
        }

        //  调用mongodb服务中的count方法
        //  传入上面的查询对象和TravelComment的字节码对象
        //  返回一个满足条件的总记录数
        long totalCount = mongoTemplate.count(query, TravelComment.class);

        //  若查询出来的总记录数为零时
        if (totalCount == 0) {

            //  直接返回一个空集合
            return Page.empty();
        }

        //  调用Pageable的of方法
        //  传入qo对象的当前页，qo对象的当前页显示的最大记录数，排序的顺序，通过_id来排序
        Pageable pageRequest = PageRequest.of(qo.getCurrentPage() - 1, qo.getPageSize(), Sort.Direction.DESC, "createTime");

        //  把限制条件加入到查询对象中
        query.with(pageRequest);

        //  调用mongodb服务中的find方法
        //  传入上面的查询对象和TravelComment的字节码对象
        //  返回一个满足条件的目的地对象的集合数据
        List<TravelComment> travelComments = mongoTemplate.find(query, TravelComment.class);

        //  返回一个PageImpl的集合
        //  传入一个满足条件的目的地对象的集合数据对象
        //  传入限制条件
        //  返回一个满足条件的总记录数
        return new PageImpl<>(travelComments, pageRequest, totalCount);
    }

    //  游记评论列表
    @Override
    public List<TravelComment> queryTravelId(String travelId) {
        List<TravelComment> travelCommentList = travelCommentRepository.findByTravelId(travelId);
        return travelCommentList;
    }


}
